#include<iostream>
#include<unistd.h>
#include"pthread.hpp"
#include"LockGuard.hpp"

using namespace std;

// 创建一把全局锁
pthread_mutex_t mtx;
int tickets = 1000;  // 有 1000 张票

// 自己封装的线程库返回值为void
void threadRoutine(void* args)
{
    int sum = 0;
    const char* name = static_cast<const char*>(args);
    while(true)
    {
        // 进入临界区，加锁
        {
            // 自动加锁，解锁
            LockGuard guard(&mtx);

            // 如果票数 > 0 ，才能抢
            if(tickets > 0)
            {
                usleep(2000);
                tickets--;
                sum++;
            }
            else
            break; // 没有票了

        }
        usleep(2000); //抢到票后也需要时间处理
    }

    // 屏幕也是共享资源，加锁可以有效防止打印结果错行
    {
        LockGuard guard(&mtx);
         cout << "线程 " << name << " 抢票完毕，最终抢到的票数 " << sum << endl;
    }

}

int main()
{
    // 在线程创建前，初始化互斥锁
    pthread_mutex_init(&mtx,nullptr);

    // 创建一批线程
    Thread t1(1,threadRoutine,(void*)"thread-1");
    Thread t2(2, threadRoutine, (void*)"thread-2");
    Thread t3(3, threadRoutine, (void*)"thread-3");

    // 启动
    t1.run();
    t2.run();
    t3.run();

    // 等待
    t1.join();
    t2.join();
    t3.join();

    // 线程退出后，销毁互斥锁
    pthread_mutex_destroy(&mtx);

    cout << "剩余票数: " << tickets << endl;

    return 0;

}
